#ifndef __THREAD_H__
#define __THREAD_H__

#include <pthread.h>
#include <stdlib.h>

namespace ECG{
	namespace Utitl{
		class Job{
		public:
			Job(){}
			virtual ~Job(){}
			/*
			*	纯虚函数，该函数在子线程中被执行
			*
			*/
			virtual void* run()=0;
		};

		class thread:public Job {
		public:
			thread();
			virtual ~thread();
			
			/**
			*	开始启动一个子线程，在子线程中执行基类的run方法
			*	成功 true 失败 FALSE
			*/
			bool start();

			/**
			 * 停止一个线程
			 *	retVal 返回的信息
			*/
			bool stop();

			/**
			 * 等待线程退出
			 * 成功 true 失败 false
			*/
			bool wait(void **out=NULL);

			/**
			 * 设置线程是否为游离状态
			 * 返回 thread引用
			*/
			thread& setDetachable(bool yes);

			/**
			 * 设置堆栈大小，如果为0，则采用默认堆栈
			 * 返回 thread引用
			*/
			thread& setStackSize(size_t size);

			/**
			 * 获取当前创建的线程的ID
			 * 返回 线程ID
			*/
			unsigned long getID() const;

		private:
			bool m_detachable;
			size_t m_stackSize;
			pthread_t m_tid;
			void* m_ret;
			static void *threadFunc(void* arg);

		};
	}
}


#endif //__THREAD_H__
